package com.hugeyurt.util;


import com.fasterxml.jackson.databind.ObjectMapper;
import com.hugeyurt.vo.Message;
import org.springframework.web.socket.*;
import org.springframework.web.socket.handler.TextWebSocketHandler;

import java.util.concurrent.ConcurrentHashMap;

/**
 * 只接受文本
 */
public class CustomWebSocketHandler extends TextWebSocketHandler {

    // 存储所有连接的会话
    private static final ConcurrentHashMap<String, WebSocketSession> sessions =
            new ConcurrentHashMap<String, WebSocketSession>();


    @Override
    public void afterConnectionEstablished(WebSocketSession session) throws Exception {
        System.out.println("session 所有属性键：" + session.getAttributes().keySet());
        /* 存入会话池 */
        String sessionId = session.getId();
        sessions.put(sessionId, session);
        System.out.println("新连接加入: " + sessionId + "，当前连接数: " + sessions.size());

        /**
         * 绑定用户名和WebSocketSession
         */
        // 1. 直接从 attributes 中获取握手阶段已提取的 username
        String username = (String) session.getAttributes().get("PRE_EXTRACTED_USERNAME");
        System.out.println("从拦截器获取到的 username: " + username);

        // 兜底逻辑（JDK 17 的字符串处理无差异）
        if (username == null || username.trim().isEmpty()) {
            username = "匿名用户_" + session.getId().substring(0, 2);
        }
        session.getAttributes().put("username", username);
        System.out.println("绑定用户名: " + username); // 此时会正常打印

    }

    @Override
    protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
        String senderName = (String) session.getAttributes().get("username");
        String payload = message.getPayload();  // 客户端发送的消息内容（可能是纯文本或JSON）

        // 1. 解析客户端发送的 JSON（关键步骤）
        ObjectMapper objectMapper = new ObjectMapper();
        Message clientMessage = objectMapper.readValue(payload, Message.class); // 反序列化为 Message 对象
        String content = clientMessage.getContent();  // 提取消息内容

        // 2. 生成服务端时间（或使用客户端时间，根据需求选择）
//        String time = new SimpleDateFormat("HH:mm:ss").format(new Date());
//         如果想用客户端发送的时间，可改为：
         String time = clientMessage.getTime();

        // 3. 封装成服务端返回的 Message 对象（可补充其他信息）
        Message serverMessage = new Message(senderName, content, time);

        // 4. 转为 JSON 字符串广播给所有客户端
        String jsonMessage = objectMapper.writeValueAsString(serverMessage);
        System.out.println("广播消息：" + jsonMessage);

        // 5. 广播
        sessions.values().forEach(s -> {
            try {
                s.sendMessage(new TextMessage(jsonMessage));
            } catch (Exception e) {
                e.printStackTrace();
            }
        });

    }

    @Override
    public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
        sessions.remove(session.getId());
        System.out.println("连接关闭: " + session.getId());
    }


}
